home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-12-02 | 2.7 KB | 123 lines | [TEXT/PICN] |
- # SHUFFLE(2)
- #
- # Shuffle values
- #
- # Ralph E. Griswold
- #
- # Last modified 5/15/83
- #
-
- procedure shuffle(x)
- x := string(x)
- if not(type(x) == ("string" | "list")) then xstop(x)
- every !x :=: ?x
- return x
- end
-
- procedure xstop(x)
- stop("Run-time error 102 in shuffle_
- \nstring or list expected\noffending value: ",
- image(x))
- end
-
- global zero, one, letters
-
- procedure main(a)
- every 1 to 3 do {
- pair := table(0)
- zero := table()
- one:= table()
- number := a[1] | 20
- &random := a[2]
- write("&random=",&random)
- letters := &lcase || &ucase
- labels := letters[1+:number]
- every c := !labels do
- zero[c] := singles(labels,c)
- every c := !labels do
- one[c] := singles(labels,c)
- every round := 1 to 8 do {
- write("\nround ",round,":\n")
- players := shuffle(labels)
- every 1 to number / 4 do {
- setting := s1 := ?players
- players := remove(players,s1)
- # write("s1=",s1)
- until *setting = 4 do {
- s1 := select(s1,players,setting) | stop("cannot construct")
- setting ||:= s1
- # write("setting=",setting)
- players := remove(players,s1)
- }
- display(setting)
- aa := []
- every push(aa,1(s := string(!setting ++ !setting),*s = 2))
- x := set(aa)
- every pair[!x] +:= 1
- }
- write(repl("-",12))
- }
- analyze(pair,labels)
- }
- end
-
- procedure singles(s,c)
- S := set([])
- every insert(S,c ~== !s)
- return S
- end
-
- procedure select(s1,base,setting)
- local s2
- if s2 := member(zero[s1],!base) then {
- every delete(zero[!setting],s2)
- every delete(zero[s2],!setting)
- }
- else if s2 := member(one[s1],!base) then {
- every delete(one[!setting],s2)
- every delete(one[s2],!setting)
- }
- else fail
- return s2
- end
-
- procedure remove(s1,s2)
- s1[find(s2,s1)] := "" | stop("cannot remove")
- return s1
- end
-
- procedure display(s)
- every writes(right(find(!s,letters),3))
- write()
- end
-
- procedure analyze(t,s)
- local hits, notes
- hits := list(10,0)
- notes := list(10,"")
- write("number of different pairings is ",*t)
- every pair := string(!s ++ !s) & *pair = 2 do {
- score := t[pair]
- hits[score + 1] +:= 1
- t[pair] := t[reverse(pair)] := 10
- if (score = 0) | (score > 2) then
- notes[score + 1] ||:= pair
- }
- write("pairings:")
- every i := 1 to 10 do
- write(i - 1,":\t",hits[i])
- write("\nnotes:")
- every i := 0 | (3 to 10) do
- write(i,":\n",xlate(notes[i + 1]))
- end
-
- procedure xlate(s)
- if *s = 0 then fail
- s1 := ""
- every i := 1 to *s by 2 do
- s1 ||:= right(find(s[i],letters),3) || right(find(s[i + 1],letters),3) ||
- "\n"
- .a
- return s1
- end
-